

#include "bsp_usart.h"
#include "board.h"
#include "modbus_slave.h"
#if 0
/**
 * @brief  配置嵌套向量中断控制器NVIC
 * @param  无
 * @retval 无
 */
static void NVIC_Configuration( void )
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );

    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init( &NVIC_InitStructure );
}
#endif

/**
 * @brief  USART GPIO 配置,工作参数配置
 * @param  无
 * @retval 无
 */
void USART_Config( void )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 打开串口GPIO的时钟
    DEBUG_USART_GPIO_APBxClkCmd( DEBUG_USART_GPIO_CLK, ENABLE );

    // 打开串口外设的时钟
    DEBUG_USART_APBxClkCmd( DEBUG_USART_CLK, ENABLE );

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure );

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init( DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure );

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    // 配置校验位
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    // 配置硬件流控制
    USART_InitStructure.USART_HardwareFlowControl =
        USART_HardwareFlowControl_None;
    // 配置工作模式，收发一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
    USART_Init( DEBUG_USARTx, &USART_InitStructure );
#if 0
    // 串口中断优先级配置
    NVIC_Configuration();

    // 使能串口接收中断
    USART_ITConfig( DEBUG_USARTx, USART_IT_RXNE, ENABLE );
#endif

    // 使能串口
    USART_Cmd( DEBUG_USARTx, ENABLE );
}

#if 0

/*****************  发送一个字节 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
{
    /* 发送一个字节数据到USART */
    USART_SendData( pUSARTx, ch );

    /* 等待发送数据寄存器为空 */
    while ( USART_GetFlagStatus( pUSARTx, USART_FLAG_TXE ) == RESET );
}

/****************** 发送8位的数组 ************************/
void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num )
{
    uint8_t i;

    for( i = 0; i < num; i++ )
    {
        /* 发送一个字节数据到USART */
        Usart_SendByte( pUSARTx, array[i] );

    }
    /* 等待发送完成 */
    while( USART_GetFlagStatus( pUSARTx, USART_FLAG_TC ) == RESET );
}

/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str )
{
    unsigned int k = 0;
    do
    {
        Usart_SendByte( pUSARTx, *( str + k ) );
        k++;
    } while( *( str + k ) != '\0' );

    /* 等待发送完成 */
    while( USART_GetFlagStatus( pUSARTx, USART_FLAG_TC ) == RESET )
    {}
}

/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch )
{
    uint8_t temp_h, temp_l;

    /* 取出高八位 */
    temp_h = ( ch & 0XFF00 ) >> 8;
    /* 取出低八位 */
    temp_l = ch & 0XFF;

    /* 发送高八位 */
    USART_SendData( pUSARTx, temp_h );
    while ( USART_GetFlagStatus( pUSARTx, USART_FLAG_TXE ) == RESET );

    /* 发送低八位 */
    USART_SendData( pUSARTx, temp_l );
    while ( USART_GetFlagStatus( pUSARTx, USART_FLAG_TXE ) == RESET );
}

//重定向c库函数printf到串口，重定向后可使用printf函数
int fputc( int ch, FILE *f )
{
    /* 发送一个字节数据到串口 */
    USART_SendData( DEBUG_USARTx, ( uint8_t ) ch );

    /* 等待发送完毕 */
    while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_TXE ) == RESET );

    return ( ch );
}

//重定向c库函数scanf到串口，重写向后可使用scanf、getchar等函数
int fgetc( FILE *f )
{
    /* 等待串口输入数据 */
    while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_RXNE ) == RESET );

    return ( int )USART_ReceiveData( DEBUG_USARTx );
}
#endif


//*************************************************************//
// 系统rt_kprintf()函数是通过调用 rt_hw_console_output();来实现
// 而rt_hw_console_output();函数系统默认是没有实现的，所以如果要
// 使用rt_kprintf()函数，就需要用户自己实现rt_hw_console_output()函数
// 实现rt_hw_console_output()函数的前提是,要初始化串口功能,串口初始化
// 过程和裸机串口初始化过程完全一样
//************************************************************//
/**
  * @brief  重映射串口DEBUG_USARTx到rt_kprintf()函数
  *   Note：DEBUG_USARTx是在bsp_usart.h中定义的宏，默认使用串口1
  * @param  str：要输出到串口的字符串
  * @retval 无
  *
  * @attention
  *
  */
void rt_hw_console_output( const char *str )
{
    /* 进入临界段 */
    rt_enter_critical();

    /* 直到字符串结束 */
    while ( *str != '\0' )
    {
        /* 换行 */
        //RT-Thread 系统中已有的打印均以 \n 结尾，而并非 \r\n，所以在字符输出时，需要在输出 \n 之前输出 \r，完成回车与换行，否则系统打印出来的信息将只有换行
        if ( *str == '\n' )
        {
            USART_SendData( DEBUG_USARTx, '\r' );
            while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_TXE ) == RESET );
        }

        USART_SendData( DEBUG_USARTx, *str++ );
        while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_TXE ) == RESET );
    }

    /* 退出临界段 */
    rt_exit_critical();
}
//使用Finsh组件三步骤：
//1.实现该函数及rt_hw_console_output函数；
//2.rtconfig.h中开启RT_USING_FINSH宏;
//3.添加Finsh组件(cmd.c、msh.c、shell.c);
char rt_hw_console_getchar( void )
{
    //查询方式实现，记得将Usart1初始化中的中断接收配置相关代码注释掉
    int ch = -1;
    /*等待串口1输入数据*/
    if( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_RXNE ) != RESET )
    {
        ch = ( int )USART_ReceiveData( DEBUG_USARTx );
        USART_ClearFlag( DEBUG_USARTx, USART_FLAG_RXNE );
    }
    else
    {
        if( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_ORE ) != RESET )
        {
            USART_ClearFlag( DEBUG_USARTx, USART_FLAG_ORE );
        }
        rt_thread_mdelay( 10 );
    }
    return ch;
}
/**
 * @brief  配置嵌套向量中断控制器NVIC
 * @param  无
 * @retval 无
 */
static void U2_NVIC_Configuration( void )
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );

    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = U2_USART_IRQ;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init( &NVIC_InitStructure );
}
/**
 * @brief  USART GPIO 配置,工作参数配置
 * @param  无
 * @retval 无
 */
//连接了WIFI模块
void USART2_Config( void )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 打开串口GPIO的时钟
    U2_USART_GPIO_APBxClkCmd( U2_USART_GPIO_CLK, ENABLE );

    // 打开串口外设的时钟
    U2_USART_APBxClkCmd( U2_USART_CLK, ENABLE );

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = U2_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( U2_USART_TX_GPIO_PORT, &GPIO_InitStructure );

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = U2_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init( U2_USART_RX_GPIO_PORT, &GPIO_InitStructure );

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = U2_USART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    // 配置校验位
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    // 配置硬件流控制
    USART_InitStructure.USART_HardwareFlowControl =
        USART_HardwareFlowControl_None;
    // 配置工作模式，收发一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
    USART_Init( U2_USARTx, &USART_InitStructure );
#if 1
    // 串口中断优先级配置
    U2_NVIC_Configuration();

    // 使能串口接收中断
    USART_ITConfig( U2_USARTx, USART_IT_RXNE, ENABLE );
#endif

    // 使能串口
    USART_Cmd( U2_USARTx, ENABLE );
}
void USART2_IRQHandler(void)
{
	u8 res;	    
 	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据
	{	 
		res =USART_ReceiveData(USART2); 	//读取接收到的数据
		MODS_ReciveNew(res);
		//SIM7500H_DataReceive(res);
		//USART_SendData(USART3,res);//将WIFI数据直接发送到模块，不进行处理
	} 
}
/************************************************************
Function:发送数据到指定端口
Input:
Output:
*************************************************************/
void USART2_DataSend(unsigned char *data,uint16_t len)
{
	uint16_t t;
	for(t=0;t<len;t++)		//循环发送数据
	{		   
		while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);	  
		USART_SendData(USART2,data[t]);
	}	 
	while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);		

}

/**
 * @brief  配置嵌套向量中断控制器NVIC
 * @param  无
 * @retval 无
 */
//连接了超高频模块
static void U3_NVIC_Configuration( void )
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );

    /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    /* 抢断优先级*/
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    /* 子优先级 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    /* 初始化配置NVIC */
    NVIC_Init( &NVIC_InitStructure );
}
/**
 * @brief  USART GPIO 配置,工作参数配置
 * @param  无
 * @retval 无
 */
void USART3_Config( void )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 打开串口GPIO的时钟
    U3_USART_GPIO_APBxClkCmd( U3_USART_GPIO_CLK, ENABLE );

    // 打开串口外设的时钟
    U3_USART_APBxClkCmd( U3_USART_CLK, ENABLE );

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = U3_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( U3_USART_TX_GPIO_PORT, &GPIO_InitStructure );

    // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = U3_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init( U3_USART_RX_GPIO_PORT, &GPIO_InitStructure );

    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = U3_USART_BAUDRATE;
    // 配置 针数据字长
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    // 配置停止位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    // 配置校验位
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    // 配置硬件流控制
    USART_InitStructure.USART_HardwareFlowControl =
        USART_HardwareFlowControl_None;
    // 配置工作模式，收发一起
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    // 完成串口的初始化配置
    USART_Init( U3_USARTx, &USART_InitStructure );
#if 1
    // 串口中断优先级配置
    U3_NVIC_Configuration();

    // 使能串口接收中断
    USART_ITConfig( U3_USARTx, USART_IT_RXNE, ENABLE );
#endif

    // 使能串口
    USART_Cmd( U3_USARTx, ENABLE );
}
void USART3_IRQHandler(void)
{
	u8 res;	    
 
 	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收到数据
	{	 
	 			 
		res =USART_ReceiveData(USART3); 	//读取接收到的数据
//		rt_kprintf("res:%x\r\n",res);
		//USART_SendData(USART2,res);//直接将数据给WIFI模块，不进行处理
		SIM7500_DataReceive(res);//RFID的数据，进行处理
	} 
}
/************************************************************
Function:发送数据到指定端口
Input:
Output:
*************************************************************/
void USART3_DataSend(unsigned char *data,uint16_t len)
{
	uint16_t t;
	for(t=0;t<len;t++)		//循环发送数据
	{		   
		while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);	  
		USART_SendData(USART3,data[t]);
	}	 
	while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);		

}
